package com.boot.mailForCommon.utils;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class MutiPartUtil {


    private static String encoding="UTF-8";

    /**
     * 根据内容获取MimeBodyPart
     *
     * @param content 文本内容,如果引用本地文件请使用src='cid:image_fairy_tail'的形式<br>
     *                网络文件则忽略images参数
     * @param isHtml  是否为html代码<br>
     *                如果为false,则发送纯文本,且files参数无效
     * @param files   本地图片加载,数组第一个元素为文件全路径,第二个元素为cid名称,cid是content的引用
     * @return 单个part节点
     * @throws Exception
     */
    public static MimeBodyPart getPart(String content, Boolean isHtml, String[]... files) throws Exception {
        MimeBodyPart part = new MimeBodyPart();
        if (!isHtml) {// 如果为false,则发送纯文本
            part.setContent(content, "text/plain;charset=" + encoding);
            return part;
        }
        // 新建一个大节点
        MimeMultipart mimeMultipart = new MimeMultipart();

        // 解析images生成part
        for (String[] file : files) {
            // 新建文件节点
            MimeBodyPart filePart = new MimeBodyPart();
            // 读入本地文件
            DataHandler data = new DataHandler(new FileDataSource(file[0]));
            // 将文件数据添加到文件节点
            filePart.setDataHandler(data);
            // 为文件节点设置一个唯一编号(在content将引用该ID)
            filePart.setContentID(file[1]);
            // 将该文件添加至大节点
            mimeMultipart.addBodyPart(filePart);
        }

        // 新建文本节点
        MimeBodyPart textPart = new MimeBodyPart();
        // 将文本加入至节点
        textPart.setContent(content, "text/html;charset=" + encoding);
        // 将节点整合到大节点
        mimeMultipart.addBodyPart(textPart);
        // 设置节点关系为关联
        mimeMultipart.setSubType("related");
        // 将大节点封装成节点
        part.setContent(mimeMultipart);
        return part;
    }

    /**
     * 获取单个附件节点
     *
     * @param file 附件全路径
     * @param name 附件名,传入null则使用file的名称
     * @return 单个part节点
     * @throws Exception
     */
    public static MimeBodyPart getPart(String file, String name) throws Exception {
        // 创建附件节点
        MimeBodyPart part = new MimeBodyPart();
        // 读取本地文件
        DataHandler data = new DataHandler(new FileDataSource(file));
        // 将附件数据添加到附件节点
        part.setDataHandler(data);
        // 设置附件名称(需要编码)
        if (name == null || "".equals(name)) {// 如果附件名为null或"",则使用file文件名
            part.setFileName(MimeUtility.encodeText(data.getName()));
            return part;
        }
        part.setFileName(MimeUtility.encodeText(name));
        return part;
    }



    public static MimeBodyPart getPart(String htmlContent) throws MessagingException {
        MimeBodyPart mimeBodyPart= new MimeBodyPart();
        mimeBodyPart.setContent(htmlContent,"text/html;charset=" + encoding);
        return mimeBodyPart;
    }
}
